//
// Copyright (c) 2011 Alex Nesterenko
//

#include "nane/SoundSystem/OAL/OALSoundBuffer.h"
#include "nane/core/log.h"

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    OALSoundBuffer::OALSoundBuffer( ALuint _bufferID, ESoundFormat _format, uint32 _frequency, uint32 _size )
        : m_bufferID( _bufferID )
        , m_format( _format )
        , m_frequency( _frequency )
        , m_size( _size )
        , m_buffer( NULL )
    {

    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    OALSoundBuffer::~OALSoundBuffer()
    {
        NANE_ASSERT( m_buffer == NULL, "Buffer must be unlocked" );
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    ALuint OALSoundBuffer::getBufferID() const
    {
        return m_bufferID;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    ESoundFormat OALSoundBuffer::getFormat() const
    {
        return m_format;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 OALSoundBuffer::getFrequency() const
    {
        return m_frequency;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    byte* OALSoundBuffer::lock()
    {
        if( m_buffer != NULL )
        {
            LOG_WARNING("SoundBuffer locked more than once");
        }
        else
        {
            m_buffer = new byte[m_size];
        }
        return m_buffer;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void OALSoundBuffer::unlock()
    {
        if( m_buffer == NULL )
        {
            LOG_WARNING("SoundBuffer must be locked before unlocking");
        }
        else
        {
            OpenALAPI::alBufferData(m_bufferID, m_format.raw_value(), m_buffer, m_size, m_frequency);
            CheckForOpenALError();
            freeBuffer_();
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void OALSoundBuffer::freeBuffer_()
    {
        delete[] m_buffer;
        m_buffer = NULL;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
